package songZhao.MinaDemo.SimpleDemo;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSessionConfig;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
/**
 * 这个时apache mina的 简单服务器实例程序.
 * 从我了解到的视频内容中,类图里可以看出这个框架也是使用了 slect和poll的系统调用来编写的
 * 一部通信框架. 通过这两个系统调用来监听多个socket的状态,利用触发器的方式来处理那些
 * 已经准备号的socket.
 * 
 * 类中的内容没有什么特别的,都是写api的调用.
 * @author agui415
 *
 */
public class MinaServer {
	/*
	 * acceptor用来接受链接的acceptor
	 * NioSocketAcceptor 的构造函数,可以用来指定 nioProcessor的个数.即服务线程个数.
	 * 每个现成都是一个reactor反应循环,使用select和pool系统调用来等待socket ready
	 * NioSocketConnector 也是一样的构造方法.
	 */
	private NioSocketAcceptor acceptor = new NioSocketAcceptor();
	// 过滤器链的构建器,从acceptor中得出
	private DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getFilterChain();
	//从acceptor中获得的客户端session配置
	private IoSessionConfig config = acceptor.getSessionConfig();
	
	
	public void start(String host,int port) throws IOException {
		//编码器工厂
		TextLineCodecFactory textCodecFactory = new TextLineCodecFactory(Charset.forName("UTF-8"),
				LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue());
		/*
		 * 编码器工厂添加到过滤器中
		 * ProtocolCodecFilter 和ExecutorFilter 以及 LoggingFilter
		 * 是mina帮我们实现好了的ioFilter 这里只用了proto这个.
		 */ 
		ProtocolCodecFilter textCodecFilter = new ProtocolCodecFilter(textCodecFactory);
		
		//将过滤器添加到过滤器链的builder上.
		filterChainBuilder.addLast("codec", textCodecFilter);
		
		/**
		 * 添加自定义过滤器.
		 * 注意这里时添加到首位了.
		 */
		filterChainBuilder.addFirst("ServerFilter", new ServerFilter());
		
		config.setReadBufferSize(1024);
		//十秒中没有互动 则进入IDLE 
		config.setIdleTime(IdleStatus.BOTH_IDLE, 10);
		/**
		 * 这里用来设置handler,真正用来处理业务的类. 
		 */
		acceptor.setHandler(new ServerHandler());
		acceptor.bind(new InetSocketAddress(host, port));
		System.out.println("Server is listenning "+host+":"+port );
	}
	
	public static void main(String[] args) throws IOException {
		String host = args[0];
		int port = Integer.parseInt(args[1]);
		MinaServer minaServer = new MinaServer();
		minaServer.start(host,port);
	}
}
